mod api;
mod boot;
mod lib;
mod model;

use actix_files as fs;
use actix_session::{config::PersistentSession, storage::CookieSessionStore, SessionMiddleware};
use actix_web::middleware::ErrorHandlers;
use actix_web::{ 
    cookie::{self, Key},
    http::StatusCode,
    middleware::Logger,
    App, HttpServer,
};
use boot::*;
use rbatis::Rbatis; 
use async_session::{MemoryStore, Session, SessionStore as _};

#[macro_use]
extern crate lazy_static; 

#[actix_web::main] // or #[tokio::main]
async fn main() -> std::io::Result<()> {
    // 设置日志参数
    std::env::set_var("RUST_LOG", "debug");
    std::env::set_var("RUST_BACKTRACE", "1");
    env_logger::init();
    db::init_db(); // 初始化数据库

    tokio::task::spawn(async {
        crontab::cron_init().await;
    });

    HttpServer::new(move || {
        App::new()
            // 注册日志中间件
            .wrap(Logger::default()) 
            // 注册session
            .wrap(
                SessionMiddleware::builder(CookieSessionStore::default(), Key::from(&[0; 64]))
                    .cookie_secure(false)
                    // 自定义session超时时间
                    .session_lifecycle(
                        PersistentSession::default()
                            .session_ttl(cookie::time::Duration::minutes(30)),
                    )
                    .build(),
            )
            // 路由配置
            .configure(api::router::router_config)  
            // 注册静态文件目录：把 static 目录下的文件注册到 / 上,这里因为是挂载在 / 上，所以需要放到最后，以免其他路由失效。
            .service(fs::Files::new("/", "./static/").index_file("admin/login.html"))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}
